﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Business_Layer;
using Data_Access_Layer;
using log4net;
using log4net.Config;

namespace CaffeBillard
{
    public partial class FormDesk :DevComponents.DotNetBar.Office2007Form
    {

        protected static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        public FormDesk()
        {
            InitializeComponent();
            dgvDesk.AutoGenerateColumns = false;
        }


        #region Khai báo
        /// <summary>
        /// Tạo biến điều khiển bàn
        /// </summary>
        private DeskController _manager;
        /// <summary>
        /// Tạo đối tượng bàn
        /// </summary>
        private Desk _desk;
        /// <summary>
        /// Tạo biến lưu trạng thái datagriview
        /// </summary>
        private bool _curr=false;
        /// <summary>
        /// Tạo biến để kiểm tra chọn tất cả
        /// </summary>
        private bool _selectall;
        private Utility _com;
        /// <summary>
        /// Lấy tên nhân viên
        /// </summary>
        private string name="";
        #endregion


        //Load form
        private void DeskForm_Load(object sender, EventArgs e)
        {
            this.BackColor = Color.FromArgb(194, 217, 247);
            _manager = new DeskController();
            _com= new Utility();
            BindingCbb();
            LoadDesk();
            name = Employee.Objects.FirstOrDefault(x => x.Id == WorkSession.Current.CurrentAccount.EmpId).Name.ToString();
        }


        #region Sự kiện trong form

       

        //Thêm hoặc cập nhật
        private void dgvDesk_RowValidated(object sender, DataGridViewCellEventArgs e)
        {
            if(_curr)
            {
                try
                {
                    XmlConfigurator.Configure();
                    log.Info(name + " Them moi mot ban");

                    var d = dgvDesk.Rows[e.RowIndex];
                    _desk = new Desk();
                    _desk.Id = int.Parse(d.Cells[1].Value.ToString());
                    _desk.DeskName = d.Cells[2].Value.ToString();
                    _desk.DeskType = d.Cells[3].Value.ToString();
                    _desk.Status = false;
                    _desk.TimeIn = null;
                    _desk.Price = float.Parse(d.Cells[5].Value.ToString());
                    _desk.Deleted = false;
                    var kt = _manager.GetAll();
                    bool k = false;
                    for (int i = 0; i < kt.Count; i++)
                    {
                        if (kt[i].DeskName == _desk.DeskName)
                        {
                            k = true;
                            break;
                            
                        }
                    }
                    if (k)
                    {
                        MessageBox.Show("Không được thêm bàn trung tên với bàn đã tồn tại, vui lòng nhâp tên khác",
                                        "Thông báo", MessageBoxButtons.OK,
                                        MessageBoxIcon.Warning);
                        
                    }
                    else
                    {

                        if (_manager.InsertOrUpdate(_desk))
                        {
                            MessageBox.Show("Cập nhật  thành công!!!", "Thông báo", MessageBoxButtons.OK,
                                            MessageBoxIcon.Information);
                            LoadDesk();
                        }
                        else
                        {
                            MessageBox.Show("Không thêm được!!!" + _manager._err, "Thông báo", MessageBoxButtons.OK,
                                            MessageBoxIcon.Information);
                        }
                    }
                  
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Lỗi : \n" + ex.Message);
                }       
            }
            _curr = false;
        }

        //Kiểm tra dữ liệu
        private void dgvDesk_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
        {
            try
            {
                if (dgvDesk.IsCurrentRowDirty && e.ColumnIndex > 0)
                {
                    var _d = dgvDesk.Rows[e.RowIndex];
                    if (_d.Cells[2].Value == null || _d.Cells[3].Value == null || _d.Cells[5].Value == null)
                    {
                        MessageBox.Show("Không được để trống dữ liệu!", "Thông báo", MessageBoxButtons.OK,
                                        MessageBoxIcon.Warning);
                        e.Cancel = true;
                    }
                    else if (!VerifyPrice(_d.Cells[5].Value.ToString()))
                    {
                        MessageBox.Show("Giá của bàn phải là kiểu số!!!", "Thông báo", MessageBoxButtons.OK,
                                        MessageBoxIcon.Warning);
                        e.Cancel = true;
                    }

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi hệ thống: \n" + ex.Message);
            }
            _curr = dgvDesk.IsCurrentRowDirty;
        }


        //Xóa bàn
        private void btnDelete_Click(object sender, EventArgs e)
        {
            XmlConfigurator.Configure();
            log.Info(name +" Xoa ban");
            try
            {
                //Lấy những dòng được chọn
                var selectedRows = dgvDesk.Rows.Cast<DataGridViewRow>()
                        .Where(x => x.Cells[0].Value != null && x.Cells[1].Value != null && x.Cells[1].Value.ToString() != "0"  && (bool)x.Cells[0].Value)
                        .ToList();
                //Nếu không có dòng nào được chọn thì thông báo cho người dùng chọn lại
                if (selectedRows.Count == 0)
                {
                    MessageBox.Show("Bạn chưa chọn bàn nào để xóa", "Thông báo",
                                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return;
                }

                //Yêu cầu người dùng xác nhận việc xóa
                if (MessageBox.Show("Những bàn bạn đã chọn sẽ bị xóa, bạn có chắc muốn xóa không?", "Cảnh báo !!!", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    //Duyệt qua từng dòng được chọn
                    for (int i = selectedRows.Count - 1; i >= 0; i--)
                    {
                       
                        //Nếu bàn đang sử dụng thì không cho xóa
                        var kt =
                            Desk.Objects.FirstOrDefault(
                                x => x.Id == int.Parse(selectedRows[i].Cells[1].Value.ToString()));
                        if (kt.Status)
                            MessageBox.Show(kt.DeskName +" đang hoạt động, không xóa được");
                        else
                        {
                            var d = selectedRows[i].DataBoundItem as Desk;
                            d.Id = int.Parse(selectedRows[i].Cells[1].Value.ToString());

                            d.Deleted = true;
                            _manager.Delete(d);
                        }
                       
                    }
                    //Load lại danh sách nhà cung cấp
                    LoadDesk();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi : \n" + ex.Message);
            }
            
        }

        //Xuất danh sách bàn ra Excel
        private void btnPrint_Click(object sender, EventArgs e)
        {
            XmlConfigurator.Configure();
            log.Info(name + " Xuat danh sach ban");
            CustomEx ex= new CustomEx();
            ex.Show();
            ex.FormClosed += ex_FormClosed;
        }

         private  void ex_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (CustomEx.Hz.type == 2)
                ExportToPDF();
            else if (CustomEx.Hz.type==1)
                ExportToEx();
        }

        //Tìm kiếm
        private void txtKeys_TextChanged(object sender, EventArgs e)
        {
            int n = 0;
            
            if (cbbFindType.Text == "Tìm theo mã")
            {
                if (txtKeys.Text == "")
                    LoadDesk();
                if(int.TryParse(txtKeys.Text, out n))
                    dgvDesk.DataSource = new BindingSource {DataSource = _manager.FindById(int.Parse(txtKeys.Text))};
                else
                {
                    txtKeys.Text = "";
                }
            }
            else if (cbbFindType.Text == "Tìm theo tên")
            {
                dgvDesk.DataSource = new BindingSource {DataSource = _manager.FindByName(txtKeys.Text)};
            }
        }


        //Xác định kiểu tìm kiếm
        private void cbbFindType_SelectedIndexChanged(object sender, EventArgs e)
        {
            if(cbbFindType.Text=="Tất cả")
                dgvDesk.DataSource = new BindingSource { DataSource = _manager.GetAll()};
            if (cbbFindType.Text == "Tìm theo mã" || cbbFindType.Text == "Tìm theo tên")
            {
                txtKeys.Enabled = true;
                cbbStatus.Enabled = false;
                cbbType.Enabled = false;
            }
            else if (cbbFindType.Text == "Tìm theo trạng thái")
            {
                cbbStatus.Enabled = true;
                txtKeys.Enabled = false;
                cbbType.Enabled = false;
            }
            else
            {
                cbbType.Enabled = true;
                txtKeys.Enabled = false;
                cbbStatus.Enabled = false;
            }

        }

        //Tìm theo loại bàn
        private void cbbType_SelectedIndexChanged(object sender, EventArgs e)
        {
            dgvDesk.DataSource = new BindingSource { DataSource = _manager.FindByType(cbbType.Text) };
        }


        //Tìm theo trạng thái
        private void cbbStatus_SelectedIndexChanged(object sender, EventArgs e)
        {
            bool stt = (cbbStatus.Text == "Đang bận") ? true : false;
            dgvDesk.DataSource = new BindingSource { DataSource = _manager.FindByStatus(stt) };
        }
        #endregion

        #region Các phương thức bổ sung
        private void LoadDesk()
        {
            dgvDesk.DataSource = new BindingSource {DataSource = _manager.GetAll()};
        }

        //Thêm dữ liệu vào cbb loại bàn
        private void BindingCbb()
        {
            string[] type = {"Phăng", "Lỗ"};
            clLoai.Items.Add(type[0]);
            clLoai.Items.Add(type[1]);
        }

        //Xuất danh sách bàn ra file Excel
       
        private void ExportToEx()
        {
           
            saveFileDialog1.Filter = "(*.xls;*.xlsx)|*.xls;*.xlsx";
            saveFileDialog1.FileName = "*.xlsx";
            if (dgvDesk.Rows.Count - 1 == 0)
                MessageBox.Show("Không có dữ liệu để xuất");
            else
                if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                {

                    _com.ExportToExcel(dgvDesk, saveFileDialog1.FileName);
                }
        }

        //Xuất danh sách bàn ra file PDF

        private void ExportToPDF()
        {

            saveFileDialog1.Filter = "(*.PDF)|*.PDF";
            saveFileDialog1.FileName = "*.PDF";
            if (dgvDesk.Rows.Count - 1 == 0)
                MessageBox.Show("Không có dữ liệu để xuất");
            else
                if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    _com.ExportToPDF(dgvDesk, saveFileDialog1.FileName);
                }
        }


        

        #endregion

        #region Các hàm kiểm tra

        //Kiểm tra giá có phải là số không
        private bool VerifyPrice(string s)
        {
            float a = 0;
            if (float.TryParse(s, out a))
                return true;
            else
            {
                return false;
            }
        }

      

        
        #endregion


        /// <summary>
        /// Sự kiện khi chọn một dòng trên datagridview
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgvDesk_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex == -1)
            {
                if (e.ColumnIndex == 0)
                {

                    if (_selectall)
                    {
                        for (int i = 0; i < dgvDesk.Rows.Count; i++)
                        {
                            dgvDesk.Rows[i].Cells[0].Value = false;
                            _selectall = false;
                        }
                    }
                    else
                    {
                        for (int i = 0; i < dgvDesk.Rows.Count; i++)
                        {
                            dgvDesk.Rows[i].Cells[0].Value = true;
                            _selectall = true;
                        }
                    }
                }
            }

        }

        private void dgvDesk_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {

        }

       
        



    }
}
